#define FRAME_SIZE 1000
int magfd;
+int datatype = 1;
struct termios orig_tio;
struct termios new_tio;
}
txs(frame->data, i);
- if (frame_number == 0xffffffff) {
+ if (datatype == 3 && frame_number == 0xffffffff) {
/*
* Do not wait for ACK for flash erase command
* We have to receive just a series of 0x87 for every
goto retry_tx;
}
+ if (datatype == 4) {
+ for (i = 0; (i = rxc()) ;) {
+ if (i == 0x55)
+ return 0;
+ }
+ }
+
/*
* Eat the 'OK' codes the unit spits out after the frame.
*/
restore_port()
{
if (magfd) {
+ sleep(1);
tcsetattr(magfd, TCSAFLUSH, &orig_tio);
+ sleep(1);
+ close(magfd);
+ magfd = 0;
}
}
}
tcgetattr(magfd, &orig_tio);
+ atexit(restore_port);
new_tio = orig_tio;
new_tio.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|
IGNCR|ICRNL|IXON);
cfsetospeed(&new_tio, mkspeed(bitrate));
cfsetispeed(&new_tio, mkspeed(bitrate));
tcsetattr(magfd, TCSAFLUSH, &new_tio);
- read(magfd,clean_buff,sizeof(clean_buff));
+ while(read(magfd,clean_buff,sizeof(clean_buff)) == sizeof(clean_buff))
+ /* Read until buffer is empty */;
}
* the data.
*/
void
-send_upload_cmd(unsigned detailed)
+send_upload_cmd(void)
{
static const char *cmd[] = {
"$PMGNCMD,MPUPLOAD,1*71\r\n",
"$PMGNCMD,MPUPLOAD,2*72\r\n",
"$PMGNCMD,MPUPLOAD,3*73\r\n",
- "$PMGNCMD,DBUPLOAD*77\r\n"
+ "$PMGNCMD,DBUPLOAD*77\r\n",
+ ""
};
- txs(cmd[detailed], strlen(cmd[detailed]));
+ txs(cmd[datatype], strlen(cmd[datatype]));
+ if (datatype == 4 ) {
+ cfsetospeed(&new_tio, B19200);
+ cfsetispeed(&new_tio, B19200);
+ } else {
cfsetospeed(&new_tio, B115200);
cfsetispeed(&new_tio, B115200);
+ }
tcsetattr(magfd, TCSADRAIN, &new_tio);
}
signal(SIGALRM, SIG_DFL);
return;
}
- restore_port();
fprintf(stderr, "Fatal error: No communications %d.\n", magfd);
exit(1);
{
vld *frame;
if (length > 0) {
+ if (datatype == 3) {
frame = make_xframe(buff, length, address);
+ } else {
+ unsigned long first4bytes;
+ first4bytes = (*buff++ << 24) & 0xff000000;
+ first4bytes |= (*buff++ << 16) & 0x00ff0000;
+ first4bytes |= (*buff++ << 8) & 0x0000ff00;
+ first4bytes |= *buff++ & 0x000000ff;
+ frame = make_xframe(buff, length-4, first4bytes);
+ }
printf("\rProgramming %4d bytes at address: %08x", length, address);
fflush(stdout);
xmit_xframe(frame, address-1);
}
printf("Lowest address = %08X, Highest address = %08X\n", min_address, max_address);
fseek(infile, 0, 0);
+ if (datatype == 3) {
flash_erase(min_address, max_address);
printf("\n");
+ }
while(fgets(string, sizeof(string)-1, infile)) {
if ((rc = get_srec(string, &srec)) <= 0)
continue;
FILE *inf;
int c;
unsigned bitrate = 4800;
- int detailedmap = 1;
const char *portname = "/dev/ttyS0";
const char *ifilename = NULL;
switch(c) {
case 't':
if (strcmp(optarg,"s") == 0)
- detailedmap = 2;
+ datatype = 2;
else if (strcmp(optarg,"d") == 0)
- detailedmap = 1;
+ datatype = 1;
else if (strcmp(optarg,"p") == 0)
- detailedmap = 0;
+ datatype = 0;
else if (strcmp(optarg,"h") == 0)
- detailedmap = 3;
+ datatype = 3;
+ else if (strcmp(optarg,"c") == 0)
+ datatype = 4;
else {
- fprintf(stderr,"Map type (-t option) can only be 'd', 'p', or 's'\n");
+ fprintf(stderr,"Map or file type (-t option) can only be 'd', 'p', 's' or 'h'\n");
exit(1);
}
break;
exit(1);
}
setup_port(portname, bitrate);
- send_upload_cmd(detailedmap);
+ send_upload_cmd();
sync_receiver();
inf = fopen(ifilename, "r");
perror(ifilename);
exit(1);
}
- if (detailedmap == 3) {
+ if ((datatype == 3) || (datatype == 4)) {
firmware_upload(inf,ibuf);
}
file_sz = fread(ibuf, 1, sizeof(ibuf), inf);